package com.lqk.singleton.doublecheck;

/**
 * @author lqk
 * @date 2021/11/30 13:16
 */
public class DoubleCheck {
    public static void main(String[] args) {

    }
}

/**
 * 双重检查
 *  1) Double-Check概念是多线程开发中常使用到的，如代码中所示，我们进行了两
 *  次if (singleton == null)检查，这样就可以保证线程安全了。
 *  2) 这样，实例化代码只用执行一次，后面再次访问时，判断if (singleton == null)，
 *  直接return实例化对象，也避免的反复进行方法同步.
 *  3) 线程安全；延迟加载；效率较高
 *  4) 结论：在实际开发中，推荐使用这种单例设计模式
 *  5) private static volatile Singleton instance; 使用 volatile 是保证 instance 的
 *  有序性，不会因为指令重排而导致错误
 */
class Singleton{
    private static volatile Singleton instance;

    private Singleton(){

    }
    // 加入双重检查代码，解决线程安全问题，同时解决懒加载问题
    public static synchronized Singleton getInstance(){
        if (instance == null){
            synchronized (Singleton.class){
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
